package com.wang.tool.monitor;

import com.wang.tool.common.ErrorInfo;
import com.wang.tool.monitor.aop.AnnotationWeaver;
import com.wang.tool.monitor.aop.Monitor;
import com.wang.tool.monitor.core.MonitorInfo;
import com.wang.tool.monitor.template.MonitorInvoker;
import com.wang.tool.util.SimpleLogUtil;

import java.util.Map;

class Demo {

    public static void main(String[] args) {
//        完整优化的记录日志，摘要日志，标签日志

//        1.启动类加注解@EnableMonitor / 全局配置 MonitorConfigCenter

        /*带有上下游链路信息*/

        //1.普通业务日志
        LinkLogUtil.info("哈哈哈，name:{0}","shaopemng");


        LinkLogUtil.error("异常码",new IllegalArgumentException("参数异常"),"名称不合规范，name:{0}","shaopemng");


        //2.普通自定义日志
        LinkLogUtil.log("自定义logger名称","哈哈哈，name:{0}","shaopemng");


        //3.需要监控的日志
        LinkLogUtil.newTagLog("文档解析失败")
                .v1("文档id")
                .addAttachment("失败原因","文档类型未指定")
                .log();




        //5.一般由框架/config类场景下使用
        //@see b&c端接口日志建议LinkLogUtil
        SimpleLogUtil.info("最普通日志");


//        4.监控模板执行,自动记录摘要日志
//        //4.摘要日志 一般不建议手动输出此摘要,这里仅做展示
////        @see DigestAndMonitorDemo.java
//        LinkLogUtil.newDigestLog("ai", "商家助手", "对话")
//                .addDigest("摘要1key", "摘要2key")
//                .addDigest("摘要2key", 1)
//                .addPayload("参数", new JSONObject())
//                .log();
        String result = InvokeTemplate.monitor("类名", "方法名", new MonitorInvoker<String>("参数") {

            @Override
            public void weaveOnBefore(MonitorInfo<String> monitorInfo) throws Throwable {
                monitorInfo.addDetailParam(monitorInfo.getParams());
//在internalCall之前调用
                //可以向monitorInfo添加摘要，入参详情等
                //本方法抛出异常不影响主流程
//                前置动作
            }

            @Override
            public String internalCall() throws Throwable {
//                执行业务
                return "正确结果";
            }

            @Override
            public void weaveOnAfter(MonitorInfo<String> monitorInfo) throws Throwable {
                monitorInfo.addDigest("测试摘要", "摘要结果");
//在internalCall之后调用
                //可以向monitorInfo添加摘要，结果详情等
                //本方法抛出异常不影响主流程
//                后置动作
            }

            @Override
            public String handleError(Throwable e, ErrorInfo error) {
//                处理异常
                return "错误结果";
            }
        });

//        4.注解执行函数(spring环境),自动记录摘要日志
//         看示例Ser

    }


    private static class Ser{


        //        需要监控的函数添加注解
        @Monitor
        public String dos(String param){
            return "真确的结果";
        }

        //        需要监控的函数添加注解，自定义编织类
        @Monitor(weaver = TestWeaver.class)
        public String dos2(String param){
            return "真确的结果";
        }

    }


    private static class TestWeaver implements AnnotationWeaver {

        @Override
        public void init(String group, String biz, String action, boolean printParam, boolean printResult, Map config) throws Throwable {

        }

        @Override
        public void weaveOnBefore(MonitorInfo monitorInfo) throws Throwable {
            monitorInfo.addDetailParam(monitorInfo.getParams());
            //前置回调
        }

        @Override
        public void weaveOnAfter(MonitorInfo monitorInfo) throws Throwable {
//            后置回到
            monitorInfo.addDigest("测试摘要", "摘要结果");
        }
    }


}